]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Consolidate creation of login and unlock dialog in the screenshield
authorGiovanni Campagna <gcampagna@src.gnome.org>
Sat, 26 May 2012 15:04:25 +0000 (17:04 +0200)
committerGiovanni Campagna <gcampagna@src.gnome.org>
Sat, 21 Jul 2012 13:40:28 +0000 (15:40 +0200)
The design calls for the curtain to appear in the gdm greeter too.
Implement this by having the screenshield manage the login dialog
(delegating its creation to SessionMode).

https://bugzilla.gnome.org/show_bug.cgi?id=619955

data/Makefile.am
js/gdm/loginDialog.js
js/ui/main.js
js/ui/screenShield.js
js/ui/sessionMode.js
js/ui/unlockDialog.js

index b00bb3b17490d2895d5d05b7d3744cb8955bc100..7a80948b69d249c86661d9578237670f267978da 100644 (file)
@@ -34,7 +34,6 @@ dist_theme_DATA =                             \
        theme/dash-placeholder.svg              \
        theme/filter-selected-ltr.svg           \
        theme/filter-selected-rtl.svg           \
-       theme/gdm.css                           \
        theme/gnome-shell.css                   \
        theme/panel-button-border.svg           \
        theme/panel-button-highlight-narrow.svg \
index d2e57385724577fe8d7a6910342d13839ac1ec7f..06bbfcb4c60f82a3f3158fe88cc99ad5c133af56 100644 (file)
@@ -646,8 +646,11 @@ const LoginDialog = new Lang.Class({
     Name: 'LoginDialog',
     Extends: ModalDialog.ModalDialog,
 
-    _init: function() {
-        this.parent({ shellReactive: true, styleClass: 'login-dialog' });
+    _init: function(parentActor) {
+        this.parent({ shellReactive: true,
+                      styleClass: 'login-dialog',
+                      parentActor: parentActor
+                    });
         this.connect('destroy',
                      Lang.bind(this, this._onDestroy));
         this.connect('opened',
@@ -858,7 +861,7 @@ const LoginDialog = new Lang.Class({
         GdmUtil.fadeOutActor(this._promptFingerprintMessage);
     }
 
-    _onCancel: function() {
+    cancel: function() {
         this._userVerifier.cancel();
     },
 
@@ -901,7 +904,7 @@ const LoginDialog = new Lang.Class({
     _showPrompt: function() {
         let hold = new Batch.Hold();
 
-        let buttons = [{ action: Lang.bind(this, this._onCancel),
+        let buttons = [{ action: Lang.bind(this, this.cancel),
                          label: _("Cancel"),
                          key: Clutter.Escape },
                        { action: Lang.bind(this, function() {
index ee999dd65d9619aa46851180941e94a2f60de556..319fb7b81b2ccb3bd17ccdcd0d6acf106751c8f6 100644 (file)
@@ -36,6 +36,7 @@ const SessionMode = imports.ui.sessionMode;
 const ShellDBus = imports.ui.shellDBus;
 const ShellMountOperation = imports.ui.shellMountOperation;
 const TelepathyClient = imports.ui.telepathyClient;
+const UnlockDialog = imports.ui.unlockDialog;
 const WindowManager = imports.ui.windowManager;
 const Magnifier = imports.ui.magnifier;
 const XdndHandler = imports.ui.xdndHandler;
@@ -94,14 +95,21 @@ function createUserSession() {
 }
 
 function createGDMSession() {
+    screenShield.showDialog();
+}
+
+function createGDMLoginDialog(parentActor) {
     // We do this this here instead of at the top to prevent GDM
     // related code from getting loaded in normal user sessions
     const LoginDialog = imports.gdm.loginDialog;
 
-    let loginDialog = new LoginDialog.LoginDialog();
-    loginDialog.connect('loaded', function() {
-                            loginDialog.open();
-                        });
+    let loginDialog = new LoginDialog.LoginDialog(parentActor);
+    return [loginDialog, true];
+}
+
+function createSessionUnlockDialog(parentActor) {
+    let dialog = new UnlockDialog.UnlockDialog(parentActor);
+    return [dialog, false];
 }
 
 function createInitialSetupSession() {
index e852f3275a41fb097ceb8ff7f6f9ae4d6c746339..e69cc7f20f5c10602346a426bc9c3a3f767cf2ba 100644 (file)
@@ -9,7 +9,6 @@ const St = imports.gi.St;
 
 const GnomeSession = imports.misc.gnomeSession;
 const Lightbox = imports.ui.lightbox;
-const UnlockDialog = imports.ui.unlockDialog;
 const Main = imports.ui.main;
 const Tweener = imports.ui.tweener;
 
@@ -97,7 +96,7 @@ const ScreenShield = new Lang.Class({
 
     _onLockScreenKeyRelease: function(actor, event) {
         if (event.get_key_symbol() == Clutter.KEY_Escape) {
-            this._showUnlockDialog();
+            this._showUnlockDialog(true);
             return true;
         }
 
@@ -124,7 +123,7 @@ const ScreenShield = new Lang.Class({
     _onDragEnd: function(action, actor, eventX, eventY, modifiers) {
         if (this._lockScreenGroup.y < -(ARROW_DRAG_TRESHOLD * global.stage.height)) {
             // Complete motion automatically
-            this._showUnlockDialog();
+            this._showUnlockDialog(true);
         } else {
             // restore the lock screen to its original place
             // try to use the same speed as the normal animation
@@ -146,7 +145,9 @@ const ScreenShield = new Lang.Class({
         if (status == GnomeSession.PresenceStatus.IDLE) {
             if (this._dialog) {
                 this._dialog.cancel();
-                this._dialog = null;
+                if (!this._keepDialog) {
+                    this._dialog = null;
+                }
             }
 
             if (!this._isModal) {
@@ -169,32 +170,54 @@ const ScreenShield = new Lang.Class({
         }
     },
 
-    _showUnlockDialog: function() {
-        if (this._dialog)
-            return;
+    showDialog: function() {
+        this.lock();
+        this._showUnlockDialog(false);
+    },
 
-        // Tween the lock screen out of screen
-        // try to use the same speed regardless of original position
-        let h = global.stage.height;
-        let time = CURTAIN_SLIDE_TIME * (h + this._lockScreenGroup.y) / h;
-        Tweener.removeTweens(this._lockScreenGroup);
-        Tweener.addTween(this._lockScreenGroup,
-                         { y: -h,
-                           time: time,
-                           transition: 'linear',
-                           onComplete: Lang.bind(this, this._hideLockScreen),
-                         });
-
-        this._dialog = new UnlockDialog.UnlockDialog();
-        this._dialog.connect('failed', Lang.bind(this, this._onUnlockFailed));
-        this._dialog.connect('unlocked', Lang.bind(this, this._onUnlockSucceded));
-
-        if (!this._dialog.open(global.get_current_time())) {
-            log('Could not open unlock dialog: failed to acquire grab');
-
-            // and then? best we can do is to autounlock, although that's potentially
-            // a security issue
-            this._onUnlockSucceded();
+    _showUnlockDialog: function(animate) {
+        if (animate) {
+            // Tween the lock screen out of screen
+            // try to use the same speed regardless of original position
+            let h = global.stage.height;
+            let time = CURTAIN_SLIDE_TIME * (h + this._lockScreenGroup.y) / h;
+            Tweener.removeTweens(this._lockScreenGroup);
+            Tweener.addTween(this._lockScreenGroup,
+                             { y: -h,
+                               time: time,
+                               transition: 'linear',
+                               onComplete: Lang.bind(this, this._hideLockScreen),
+                             });
+        } else {
+            this._hideLockScreen();
+        }
+
+        if (!this._dialog) {
+            [this._dialog, this._keepDialog] = Main.sessionMode.createUnlockDialog(this._lockDialogGroup);
+            if (!this._dialog) {
+                // This session mode has no locking capabilities
+                this.unlock();
+                return;
+            }
+
+            this._dialog.connect('loaded', Lang.bind(this, function() {
+                if (!this._dialog.open()) {
+                    log('Could not open login dialog: failed to acquire grab');
+                    this.unlock();
+                }
+            }));
+
+            this._dialog.connect('failed', Lang.bind(this, this._onUnlockFailed));
+            this._dialog.connect('unlocked', Lang.bind(this, this._onUnlockSucceded));
+        }
+
+        if (this._keepDialog) {
+            // Notify the other components that even though we are showing the
+            // screenshield, we're not in a locked state
+            // (this happens for the gdm greeter)
+
+            this._isLocked = false;
+            this.emit('lock-status-changed', false);
         }
     },
 
@@ -227,6 +250,14 @@ const ScreenShield = new Lang.Class({
     },
 
     unlock: function() {
+        if (this._keepDialog) {
+            // The dialog must be kept alive,
+            // so immediately go back to it
+            // This will also reset _isLocked
+            this._showUnlockDialog(false);
+            return;
+        }
+
         if (this._dialog) {
             this._dialog.destroy();
             this._dialog = null;
index dff6c84221ed79eb4ffded0e00771051f8e01575..1cc4ec346e03a21aab773dc754000c289b372b8c 100644 (file)
@@ -39,6 +39,7 @@ const _modes = {
              hasRunDialog: false,
              hasWorkspaces: false,
              createSession: Main.createGDMSession,
+             createUnlockDialog: Main.createGDMLoginDialog,
              extraStylesheet: null,
              statusArea: {
                  order: [
@@ -86,6 +87,7 @@ const _modes = {
               hasRunDialog: true,
               hasWorkspaces: true,
               createSession: Main.createUserSession,
+              createUnlockDialog: Main.createSessionUnlockDialog,
               extraStylesheet: null,
               statusArea: {
                   order: [
@@ -113,6 +115,8 @@ const SessionMode = new Lang.Class({
 
         this._createSession = params.createSession;
         delete params.createSession;
+        this._createUnlockDialog = params.createUnlockDialog;
+        delete params.createUnlockDialog;
 
         Lang.copyProperties(params, this);
     },
@@ -120,5 +124,12 @@ const SessionMode = new Lang.Class({
     createSession: function() {
         if (this._createSession)
             this._createSession();
-    }
+    },
+
+    createUnlockDialog: function() {
+        if (this._createUnlockDialog)
+            return this._createUnlockDialog.apply(this, arguments);
+        else
+            return null;
+    },
 });
index 8e4a24520adf607c1991555cdd21b045f13e495a..2b3eb37b0e79a80f71910c0b7fd127ee3b982587 100644 (file)
@@ -7,7 +7,6 @@ const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
 const Gtk = imports.gi.Gtk;
 const Lang = imports.lang;
-const Mainloop = imports.mainloop;
 const Signals = imports.signals;
 const Shell = imports.gi.Shell;
 const St = imports.gi.St;
@@ -152,6 +151,11 @@ const UnlockDialog = new Lang.Class({
 
         this._updateOkButton(false);
         this._reset();
+
+        GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
+            this.emit('loaded');
+            return false;
+        }));
     },
 
     _updateOkButton: function(sensitive) {